const server = require('express');
const superagent = require('superagent');
const cheerio = require('cheerio');
const eventproxy = require('eventproxy');
const ep = eventproxy();
const app = server();

app.get('/', (req, res, next) => {
    // 1、抓取cnode网页信息
    superagent.get('https://cnodejs.org/')
        .end(function (err, sres) {
            // 常规的错误处理
            if (err) {
                return next(err);
            }
            // sres.text 里面存储着网页的 html 内容，将它传给 cheerio.load 之后
            // 就可以得到一个实现了 jquery 接口的变量，我们习惯性地将它命名为 `$`
            // 剩下就都是 jquery 的内容了
            var $ = cheerio.load(sres.text);
            var hrefs = [];
            // 2、将所有的次级链接放入数组中
            $('#topic_list .topic_title').each(function (idx, element) {
                var $element = $(element);
                hrefs.push('https://cnodejs.org'+$element.attr('href'));
            });
            // 3、使用eventproxy处理并发爬取数据
            // 命令 ep 重复监听 topicUrls.length 次（在这里也就是 40 次） `topic_html` 事件再行动
            // 4、json格式返回
            var resArr = [];
            ep.after('topic_html', 3, function (topics) {
                // topics 是个数组，包含了 40 次 ep.emit('topic_html', pair) 中的那 40 个 pair

                // 开始行动
                topics = topics.map(function (topicPair) {
                    // 接下来都是 jquery 的用法了
                    var topicUrl = topicPair[0];
                    var topicHtml = topicPair[1];
                    var $ = cheerio.load(topicHtml);
                    return ({
                        title: $('.topic_full_title').text().trim(),
                        href: topicUrl,
                        comment1: $('.reply_content').eq(0).text().trim(),
                    });
                });

                console.log('final:');
                console.log(topics);
                resArr.push(topics);
            });

            // 为了防止网站反爬，只爬取3条数据
            hrefs.slice(0,3).forEach(function (topicUrl) {
                superagent.get(topicUrl)
                    .end(function (err, res) {
                        console.log('fetch ' + topicUrl + ' successful');
                        ep.emit('topic_html', [topicUrl, res.text]);
                    });
            });
            setTimeout(() => {
                res.send(resArr);
            },3000)            
        });
})
app.listen(8001, function () {
    console.log('程序运行在8001端口')
})